#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#include <sys/types.h>
#include <linux/input.h>
#include <unistd.h>
#include <sys/wait.h>


// 基于input子系统开发的输入驱动 会在/dev/input/eventx
// 无数据可读（阻塞） 有数据可读 返回
// struct input_event 用于解析数据
// types:发生了什么时间 同步类|按键类|相对位移类|绝对位移类
// code:针对不同的事件 code 的含义不同 可能是按键的返回值/或者是相对位移事件
// value:code不同 value的含义不同 比如按键的时候0表示松开 1表示按下 2表示长按

// 数据同步事件：告诉应用程序发完了 比如一个触点信息包含了X Y就得发两次

int main(int argc,char *argv[])
{
    struct input_event in_ev = {0};
    int fd = -1;
    if(2 != argc)
    {
        fprintf(stderr,"usage:%s<input-dev>\n",argv[0]);
        exit(-1);
    }
    if(0 > (fd = open(argv[1],O_RDONLY))) {
        perror("open error");
        exit(-1);
    }
    for(;;)
    {
        if(sizeof(struct input_event)!= 
        read(fd,&in_ev,sizeof(struct  input_event))) {
            perror("read error");
            exit(-1);
        }
        if(EV_KEY == in_ev.type) {
            switch (in_ev.value) {
                case 0:
                    printf("code <%d> 松开、/r/n",in_ev.code);
                    break;
                case 1:
                    printf("code <%d> 按下",in_ev.code);
                    break;
                case 2:
                    printf("code <%d> 长按\r\n",in_ev.code);
                    break;             
            }
        }
        printf("type:%d code:%d value:%d\r\n",
            in_ev.type,in_ev.code,in_ev.value);
    }
    return 0;
}
